信号量其实就是将异步执行变成了同步执行

信号量和锁其实差不多,锁每一次允许一个线程对数据进行修改,而信号量每次允许 num 个线程对数据进行修改

信号量了解就可以了

from threading import Semaphore

sem = Semaphore(4)  # 每次允许4个线程同时进来
sem.acquire()  # 上锁
print(0)
sem.acquire()  # 上锁
print(1)
sem.acquire()  # 上锁
print(2)
sem.acquire()  # 上锁
print(3)
# sem.release()  # 解锁,如果一个都没有解锁后面的线程是无法进来的
sem.acquire()  # 上锁
print(4)

1. 迷你唱吧例子

  • 假设商场里有4个迷你唱吧,所以同时可以进去4个人,如果来了第五个人就要在外面等待,等到有人出来才能再进去玩。

import time
import random
from threading import Semaphore
from threading import Thread


def sing(i, sem):
    sem.acquire()  # 上锁,如果已经进入了4个线程,其他线程就无法进入
    print('%s : 进来KTV' % i)
    time.sleep(random.randint(1, 10))  # 随机延时1-10秒之间
    print('%s : 离开KTV' % i)
    sem.release()  # 解锁,允许下一个等待的线程进入


sem = Semaphore(4)  # 每次允许4个线程进入
for i in range(20):
    t = Thread(target=sing, args=(i, sem))
    t.start()